package wodegua.d24_file_io;

import java.io.FileInputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * FileInputStream(文件字节输入流)
 * 作用:以内存为基准，可以把磁盘文件中的数据以字节的形式读入到内存中去。
 *
 * 构造器
 * public FileInputStream(File file)    创建字节输入流管道与源文件接通
 * public FileInputStream(string pathname)  创建字节输入流管道与源文件接通
 *
 * 方法名称
 * public int read()    每次读取一个字节返回，如果发现没有数据可读会返回-1.
 * public int read(byte[] buffer)   每次用一个字节数组去读取数据，返回字节数组读取了多少个字节如果发现没有数据可读会返回-1.
 *
 * 注意事项
 * 使用FileInputStream每次读取一个字节，读取性能较差，并且读取汉字输出会乱码。
 * 使用FileInputStream每次读取多个字节，读取性能得到了提升，但读取汉字输出还是会乱码。
 */
public class d7_IoFileInputStreamTest {
    public static void main(String[] args) throws Exception {
        String src = "helloworld-app/ab.txt";
        FileInputStream s1 = new FileInputStream(src);
        //每次读取一个字节
//        int b1 = s1.read();
//        System.out.println((char) b1);
//
//        int b2 = s1.read();
//        System.out.println((char) b2);
//
//        int b3 = s1.read();
//        System.out.println(b3);

//        int b;
//        while ((b=s1.read()) != -1) {
//            System.out.print((char)b);
//        }

//        System.out.println("----------------");

        //每次读取多个字节
//        byte[] b1 = new byte[3];
//        int len = s1.read(b1);
//        System.out.println(new String(b1));
//        System.out.println(len);

//        byte[] b1 = new byte[3];
//        int len;
//        while ((len = s1.read(b1)) != -1) {
//            System.out.print(new String(b1,0,len));
//        }

        /**
         * 一次读完全部字节
         * 方式一:自己定义一个字节数组与被读取的文件大小一样大，然后使用该字节数组，一次读完文件的全部字节。
         * 方式二:java官方为InputStream提供了如下方法，可以直接把文件的全部字节读取到一个字节数组中返回。
         * public byte[] readAllBytes()throws IOException    置接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
         */
//        File f1 = new File(src);
//        long len = f1.length();
//        byte[] b = new byte[(int) len];
//        s1.read(b);
//        System.out.println(new String(b));

        byte[] b = Files.readAllBytes(Paths.get(src));
        System.out.println(new String(b));


        s1.close();
    }
}
